- web6047 - (2021/09/10(金) 現在、システム調整中のため、一部の表示がおかしいかもしれません)

 homepage6047 Top Page 2018年 8月




真夏なのに桜吹雪


(操作 p:ワイヤフレーム、o:背景、q,a:焦点距離、w,s:X軸回転、e,d:Y軸回転、r,f:Z軸回転、t,g:幅、y,h:高さ、i,j,k,m:位置、z:画質、space:コマ送り(STOP時))

2018/8/25(土)

「日経パソコン編 小中学生からはじめる プログラミングの本 2018年版」(1200円)のP86に、

プログラミングの授業といっても、子どもたちはコンピュータとにらめっこしながら、一人の世界にこもってプログラミングの知識や技能を身につけるのではありません。むしろ、アイデアを作品にしたり、モノを動かすなどの実体験を積み重ねながら、協力して課題を解決したり、創造性を養う活動に重きが置かれています。ゆえに、プログラミング教育はプログラミング言語を覚えるものではない、と新学習指導要領には明記されています。

と書かれていました。

これまで、国は技術だけに注目している、と私は勝手に思っていましたが、ちゃんと、技術とコミュニケーションの両方が重要と言っているわけです。

小中学生、高校生にいろいろ教えようと考えている私にとっては、こういう情報を得ることができただけでも、この本を買った意義があります。

子供に教えるんじゃなくて、子供から教わるほうかもしれないな、最近は進んでいるようだから…



この記事がおかしくてたまりませんでした。

https://rocketnews24.com/2018/08/18/1103794/

中国製の格安スマートウォッチ購入の話。

基本的には中国側は親切心にあふれた対応をしているんですが、おかしな日本語とそれに対する記者の反応が面白かった。


2018/8/22(水)

映画「ジュマンジ(ウェルカムトゥジャングル)」(2017年/アメリカ/1時間59分)★★★★★

吹き替えで観ました。たくさん笑えました。

地図学者役のジャック・ブラック(俳優)がぴったりの はまり役で面白かったです。

あと美女役の人のアクションがカッコよかった!


2018/8/18(土) お盆休み

今月のトップページの JavaScript は「桜吹雪」

真夏で、夕焼けで、桜吹雪なので、だいぶミスマッチしています。

夕焼けはプログラムを作っているときに窓から見えた夕焼けを見ながら色を選んだので、本物っぽい夕焼けになっています。

ビルのシルエットは高さと幅を乱数で決めています。

キーボードの o キーを押すと「夕焼け」「夜桜」「無地」「青空と草原」の4種類を切り替えます。

いつものことですが、3DCGの原理の計算式 h = x * ( s / z ), v = y * ( s / z ) で3D計算を行っています。

プログラムリスト

fig.
▲花びらはCANVASのパスで描いている

桜の花びら1枚はJavaScriptのCANVASの「パス」で描かれています。

パスの頂点は x, y の2次元座標で指定されていますが、これに z 座標を加えると、3次元空間の中で2次元のパスを出現させることができるようになります。

JavaScript の CANVAS が3次元をサポートしているのではありません。CANVAS はあくまでも2次元座標で描画するものです。

  1. 花びらを x, y, z の3次元座標を使って3次元空間にデータとして作成する。
  2. その x, y, z のデータに、 h = x * ( s / z ), v = y * ( s / z )  の計算を行って、2次元座標の h, v を得る。
  3. その2次元座標 h, v を使って、CANVAS で花びらを描くと、3次元の景観が画面に描かれる。




fig.
▲各頂点を x-z 座標系で回転させる

この花びらのパスの各頂点を3次元空間のなかで、sin(), cos() を使って回転させます。

左図のように水平方向に回転させる場合は、x-z 座標系で回転させます。「x-z 座標系で」とはつまり、x, y, z 座標の x と z だけに着目するということであり、y 座標は完全に無視して計算します。

”3次元空間での回転” と言うと難しそうですが、結局は 2 次元での回転と同じ計算を行います。



自然の桜吹雪らしく見せるためにいろいろ工夫をしました。1つ1つの工夫の有無で どう違うのか わかるようにしてあるので違いを見ていきましょう。

花びらを100個くらい、x, y, z それぞれランダムに配置して、それぞれを上記のとおり単純に回転させると以下のような動きになります。

There is no canvas.

全ての花びらが同じ方向を向いたまま回っています。

花びら1つ1つには自転してほしいですよね。

自転させてみましょう。

There is no canvas.

これなら桜吹雪と言っても良いでしょう。

でも現在、正六面体状に、花びらを配置しています。

これを円筒形にしてみましょう。

▲サイコロ状に配置していた花びらを、円筒形状に配置するよう、変更する

There is no canvas.

前の動きと比べてみると、違いがほとんど感じられません。

しかし、花びらの数を2000枚に増やすと、どのように配置するかで以下のように違いが出てきます。

ただ実際は、2000枚の設定でプログラムを使うことはなく、100枚で足りているので、正六面体状に配置する方法で問題ない(どの形状に配置しても同じなら計算が単純なほうが良い)と思います。

それに、桜吹雪なので、回転の角度によってムラが出たり出なかったりしているほうが、波があって自然かもしれません。(上図の右端が良いかも)

つまり円筒形状に配置するのは、桜吹雪を良く見せるための工夫としては、あまり意味がなく、無駄足でした。しかし無駄足も成功のためのステップであり、ためになります。

次は、花びらが時々一本の線になっているときがあります。

▲花びらが一本の線になる瞬間がある。それが花びららしくない。

これが結構、花びらっぽくないので直しましょう。直しましょうと言ってもちょっと難しいです。

面が向いている向き(下図赤線)と、視線の方向(下図青線)との角度を求め、それが直角に近い時は、上図の「線に見える状態」なので、そのときは角度を別の角度にリセットします。難しく言うと、面の法線と視線方向との内積を得る、という高校数学の話です。

大事なことですが私は「内積って何?」と聞かれたら何も答えられません。べつに内積を知らなくても、内積を使うことはできるんです(内積の公式のとおりに計算すれば、ほしい結果が得られる)。そのプログラムを作るためにすべてを知っている必要はなく(すべてを勉強・習得する必要はなく)、とりあえずそのプログラムを実現するために必要な方法を導入するんです。理解するとしたら後から理解すれば良いでしょう。だってとりあえず動かしたいでしょ。

▲花びらの角度を検出する。(いくらか3D計算の経験が必要になる。3D計算の経験は「3DCGの原理の式」だけでも積むことが可能)

There is no canvas.

よく見ていると、線になりそうになると、パッと角度が変わるでしょう?

次は迫力を出すために円筒形を少し傾けます。

▲円筒形を斜めに傾けてみる

There is no canvas.

ちょっとかっこよくなったような?

よく見ると画面の右上のほう(赤く塗った部分)で、「とどまったまま、同じ場所で自転だけしている花びら」がないでしょうか?

ランダムに配置したので場合によっては見当たらないかもしれませんが、ページ更新したりして再描画させるとみつかるかもしれません。

対策としては、筒形状を ちくわ形状にします。

▲円筒形をちくわ状にすれば、「中央で自転だけしている花びら」をなくせるだろう


There is no canvas.

これで納得! でももっとひとくせ入れます。

アニメ「超時空要塞マクロス」のあの弾道に煙を残しながら規則正しく進む大量のミサイルなんですが、あれはすべてが規則正しく進むのではなく、たとえば10個のミサイルの内、1個は別ルートを取っているそうです。そうすることで、複雑な印象、リアルな印象、、確かそんなことだったと思いますが、そういうものを与える効果があるそうです。

ちくわを2つにして、いっぽうは花びらの数を20%に少なくして、ちくわの傾きも20%増やし、花びらの色を少し濃い目にしてみます。

There is no canvas.

どうです? なかなかリアルでしょう?

しかし、もうちょっとがんばって、前述の赤文字で

>それに、桜吹雪なので、回転の角度によってムラが出たり出なかったりしているほうが、波があって自然かもしれません。(上図の右端が良いかも)

と書いていたことを実行しましょう。

「円筒くりぬき状」で配置していた花びらを、「正六面体くりぬき状」で配置する方法に変更します。

There is no canvas.

まぁ、ときどき桜の花びらの量にムラが出てくれるとありがたいのですが、なにぶん、花びらの量が少ないので違いはわからないかもしれませんね…。

Wikipediaに「花吹雪」の動画があるので比べてみてください。https://ja.wikipedia.org/wiki/花吹雪

以上のとおり、たくさんの工夫のうえで成り立っています、というお話でした。


2018/8/16(木) お盆休み

実家に帰ってきました。

自宅最寄り駅→(特急電車)→東京駅→(総武線快速)→木更津方面

という道のりでずっと座っていましたが、ヘトヘトになりました。

思えばいろいろありました。


特急電車では、Uターンラッシュで満員でしたが、私が座った席の はす向かいの席で、

「そこは私の予約の席です」「いや私の予約の席です」

という押し問答が始まりました。

切符を見比べたり、「切符の発行時刻がどっちが先だからどっちが有効」だとか?

もともと座っていた人が立って、後から来た人が座っちゃったりしていましたが、どっちも自分が正しいと思っているようで、緊張感がただよっていました。駅員呼んだほうがいいような?私も周りの人もその様子にくぎづけ。

でも結局は後から来たオジサンが電車自体(特急電車番号)を間違っていたらしく、その場は収まりました。

私の席の隣に座っていたお兄さんが「ンなわけないんですよねぇ」と私にささやき、私は「ははは…」と はにかみ笑い。


次に東京駅では、これから総武線快速に乗ろう、あと5分というときに、自分の異常事態に気づきました。

東京駅までの特急電車の乗車券・特急券は持っている。でも東京駅以降の切符は持っていなくて乗り越し精算しようと思っている。しかし財布にお金がない。クレジットカードとキャッシュカードは持ってる…。この状態で目的の駅まで行ってしまうと、乗り越し精算(足らない分の支払い)はできないんじゃ?

急いで「電車 精算 クレジットカード」でWEB検索したら、「目的の駅でお金がないことに気づいて駅員に事情を話して特別にクレジットカードで清算してもらいました」という話がありました。(乗り越し精算機はクレジットに対応していない?)

同じことをやるにも自分はその人と違って事前に気づいていて、その状態で目的地の駅で駅員にお願いしても迷惑をかけそうだし、目的地の駅で家族を呼ぶのもいまいちだし…、WEBの話の最後に「ちゃんとお金用意しておけよって話ですよね」という言葉もあったしで、発車まであと3分くらいでしたが判断して、目の前の快速はあきらめました。

ホームの並びの列に背中を向けて駅のATMへ行ってちゃんとお金をおろして、1時間後の総武線快速に乗りました。


お次は、目的地の駅に降り立つと、なんだ?この人ごみは?浴衣なんか着てたりして…、8/15は木更津の花火大会だっけ…その帰りの人たちかな? なんか落ち着かないな。


そんなこんなで、ずっと座っていたのにヘトヘトになって実家に着きました。仕事で疲れているっていうのもあるけど、お盆の後半に帰省するとか、自分は無計画すぎるんだよな…。


2018/8/14(火) お盆休み

fig.
▲これはなんだお弁当だ

お盆休み中。実家に帰る予定ですが、まだ自宅の部屋で もたもた しています。

今日は一人でいて、お昼ごはんはお弁当にしました。

いつも朝起きては15分程度で作って会社へ持っていくので、その習慣もあってか お弁当作るのに抵抗はありません。最近は冷凍食品を詰めるだけで立派なお弁当ができてしまうので、盛り付けだけで10分~15分程度で作り終わってしまいます。




2018/8/12(日)

エッジ検出(図形など)のプログラム

fig.
▲「山を背景に、猫がジャンプしている図」ではありません。

(写真などのリアルな画像からのエッジの検出の話はしていませんのでご注意ください)

SVC(SideViewCharacter)では、構成するパーツごとに原点の座標がどこなのかをデータとして持っている必要があります。

自作のSVCのエディターを使ったり、目分量などで、その座標を指定するわけですが、それもいろいろ面倒なので、画像内に画像で×を記入して、そこを原点として認識するようにしようと考えました。

そして、いろいろ調べていたら、「パターン認識」だとか、「画像認識」、「エッジ検出」に「openCV」、はたまた「OCR」など、それなりの分野になっていました。

たかが×を検出するだけなのに。(中島みゆきの歌で「たかが愛」ってありましたが…)

図形の「×」を、「×である」(ーや○ではない)と認識したいわけですが、そのためには「エッジ検出」をまず最初に行って、そのあとで「パターン認識」という処理が来るようです。

今回はその「エッジ検出」のプログラムです。誰の助けも借りずに自分で考えたアルゴリズムです。自分で考えたと言っても、その方法はすでにこの世のどこかにあるのかもしれません。

左の画像リンクをクリックすると JavaScript を実行します。

Cという文字の中に記号を入れると、その記号は認識されないようになっています。高速化のためにわざとそうしてあります。

最近、AIなどで、画像処理が注目されているので、「エッジ検出」について調べている方もいると思うので、このプログラムリストは人気があるんじゃないかなと思います。特に著作権などを主張したりはしませんので、自由にコピペしてください。

プログラムリスト

プログラムは、画像形状のドット配列をすべて取得(エッジ検出)した後、キーが入力されたらその配列を使って赤い線を描いている…というものです。ライブラリなどは一切使用していなくて、単一のファイルで成り立っています。そんなに長いプログラムではありません。

getShapes()関数の引数リストに tolerance という単語が並んでいます。これは「許容量」という意味で、画像ソフトなどで一部の色に対して選択範囲を適用するとき、「許容量」次第でどの程度の明るい部分を選択範囲にするのかを変えることができる…、というのを見たことがある人は多いと思います。それと同じです。tolerance の値をいろいろ変えると、うまく認識できたり、できなかったりが変わってきます。


パターン認識はまだできてません

fig.
▲SVCのパーツの原点を示す×
を認識したい図(ここまでやんなきゃいけないのかという図でもある)

「エッジ検出」をしたら「パターン認識」を行うわけですが、どうやったらいいのかいろいろ悩みました。

エッジ検出の時にドットを連続でたくさん検出してドットを集めて線(エッジ)を得ているのですが、そのドット1つ1つには前のドットから見た「方向」があり、全体的に川のような流れを作っています(左図)。

左図は検出したい×記号について、ドットの方向を分かりやすくするために、拡大して矢印の流れを描いているところです。

×の一端は、エッジとしては「U字」になっていて、方向としてはUターンしています。

 ∩
⊂ ⊃ ←こんな感じ
 ∪

そのUターンを検出して、×の四方の端を検出できれば、×として認識できるんじゃないかと…。

Uの「ターン前の辺」と、「ターン中の辺」と、「ターン後の辺」の3つの辺に集まっているドットはそれぞれの辺ごとに方向が一定です。それぞれ角度が0度、90度、180度の関係になっていることを検出できれば、Uであると認識できるわけです。ほかにも方法はあると思いますが、とりあえずその方法でトライしています。

左の画像リンクをクリックすると 画像を拡大します。






2018/8/5(日)

RPGの下地プログラム試作

いろいろと細かいところまでしゃべってしまう性格なので、今回もまた下記のようにいろいろ書いているんですが、どんなに価値ある良いことを書いていたって、こんな長文を見たら、多くの人は読もうとは思わないでしょう。私の性格…「わいた疑問をほっとけない」っていうのかな。このへん直したほうが良いんでしょうね。


RPGを自分で作る際の下地になるような自作のプログラムを紹介します。

まだ試作段階のものです。

プログラミング言語でゲームを作る際は delay() とか vsync のような一定時間待つ関数がなければ、ゲーム画面のアニメーションは難しいと思います。なぜなら、アニメのコマを次々と変える際、コンピューターの高速な処理ではすべてのコマを一瞬で表示してしまい、人間の目にはアニメとして見えないからです。人間の目にもわかるようにコマ同士を一定時間、間を置いて表示する必要があります。

JavaScriptは setInterval() という関数があるのでその実現は可能です。setInterval() は一定時間ごとに指定の関数を呼びます。


今回のプログラムは、JavaScript の記述を JavaScript で読み実行します。

JavaScript は関数名に対し、たとえば test() という関数なら、test.toString() でその内容を手軽に取得できます。

取得したら1行ずつ取り出して eval() に渡して実行することが可能なんです。(eval は evaluate の略で意味は「評価」です。渡された文字列を JavaScript として評価(実行)するという関数です)

その際ちょっと特殊なことを行います。

行に対しこのような 時間に関する制御 を行うことで、JavaScript のプログラムがそのままアニメの命令になるので、便利になります。

fig.
▲アニメが終わると別のアニメを開始

前回(7/31 火)紹介したプログラムから、いくつかの不備を直しました。

左の画像リンクをクリックすると JavaScript を実行します。

最初に両端の四角がそれぞれの動きで中央に寄ります(アニメ1)。

続いて「スライムがあらわれた!」と1文字ずつ画面に表示します(アニメ2)。

プログラムリスト batch - 20180805.js(前回からの不備を直した部分はマーカーしてあります)

プログラムリスト canvas - 20180805.js(前回からの不備を直した部分はマーカーしてあります)



JavaScript を読み込んで1行1行実行する際の壁となるような「難しいこと」を挙げておきます。

現状で、

なので、次回あたりでそれらの試作を行いたいと思います。(その前にプログラムの整頓を行います)


映画「プリンス・オブ・ペルシャ(字幕)」(2010年/アメリカ/116分)★★★☆☆

ペットボトル緑茶「綾鷹」のキャンペーンでラベルの裏のアタリで観せてもらいました。

冒頭からいきなりゲーム画面さながらのジャンプジャンプを見せつけてきます。できれば、そういう大衆受けする方針を取るのではなく、物語の序盤はその特徴を伏せておいて、序盤が終わるころにさりげなく「これだ!」という感じでジャンプを見せてくれるやり方がいいなと思いました。

全体的に出来が良いんだけど、音楽に例えると「低音と高音を強調しすぎてその迫力に視聴者が疲れる」という感じがしました。2時間という再生時間が長く感じて、面白いかもしれないけど早く終わってほしい気もする…と思いながら観ていました。私が歳だからでしょうか。

スタッフロールにジョーダン・メクナーの名が並んでいた時は、PC-9801のゲームのタイトル画面でよく見ていた名前だと思いました。ジャンプの途中で画面切り替えしても全然苦にならないというすばらしいゲーム構成を思い出しました。

アクションやキャラクターがゲーム画面を思い起こさせ、その辺の巧みな映画製作の技術が★を4に?と思わせますが、名作には思えないので辛口で★3です。